package fr.agileandco.tootle.server;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import fr.agileandco.tootle.client.TootleService;
import fr.agileandco.tootle.server.modèle.Tâche;
import fr.agileandco.tootle.shared.dto.TâcheDTO;

@SuppressWarnings("serial")
public class TootleServiceImpl extends RemoteServiceServlet implements
		TootleService {

	public void enregistrer(List<TâcheDTO> tâcheDTOs) throws IllegalArgumentException {
		EntityManager em = EMF.get().createEntityManager();
		try {
			for (TâcheDTO tâcheDTO : tâcheDTOs) {
				em.persist(convertit(tâcheDTO));
			}
		} finally {
			em.close();
		}
	}

	private Tâche convertit(TâcheDTO tâcheDTO) {
		Tâche tâche = new Tâche();
		tâche.description(escapeHtml(tâcheDTO.getDescription()));
		tâche.responsable(escapeHtml(tâcheDTO.getResponsable()));
		tâche.statut(escapeHtml(tâcheDTO.getStatut()));
		return tâche;
	}

	private List<TâcheDTO> convertit(List<Tâche> tâches) {
		List<TâcheDTO> dtos = new LinkedList<TâcheDTO>();
		for (Tâche tâche : tâches) {
			dtos.add(convertit(tâche));
		}
		return dtos;
	}

	private TâcheDTO convertit(Tâche tâche) {
		TâcheDTO dto = new TâcheDTO();
		dto.setDescription(tâche.description());
		dto.setResponsable(tâche.responsable());
		dto.setStatut(tâche.statut());
		return dto;
	}

	private String escapeHtml(String html) {
		if (html == null) {
			return null;
		}
		return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;")
				.replaceAll(">", "&gt;");
	}

	@Override
	public List<TâcheDTO> récupérerToutesLesTâches() {
		EntityManager em = EMF.get().createEntityManager();
		try {
			Query q = em.createQuery("select from " + Tâche.class.getName());
			return convertit((List<Tâche>) q.getResultList());
		} finally {
			em.close();
		}
	}
}
